home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
203
/
gurusguide
/
swimsg.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
4KB
|
131 lines
/************************************************************************
********** **********
********** M E S S A G E S O F T W A R E I N T E R R U P T **********
********** --------------------------------------------------- **********
********** **********
********** Copyright (C) 1988 Sassenrath Research **********
********** All Rights Reserved. **********
********** **********
********** Example from the "Guru's Guide, Meditation #1" **********
********** **********
*************************************************************************
** **
** - NOTICE - **
** **
** The "Guru's Guide, Meditation #1" contains detailed information **
** about Amiga interrupts as well as a complete discussion of this **
** and other examples. Meditation #1 and all of its examples were **
** written by Carl Sassenrath, the architect of Amiga's multitasking **
** operating system. Copies of the "Guru's Guide" may be obtained **
** from: **
** GURU'S GUIDE, P.O. BOX 1510, UKIAH, CA 95482 **
** **
** Please include a check for $14.95, plus $1.50 shipping ($4.00 if **
** outside North America). CA residents add 6% sales tax. **
** **
** This example may be used for any purposes, commercial, personal, **
** public, and private, so long as ALL of the above text, copyright, **
** mailing address, and this notice are retained in their entirety. **
** **
** THIS EXAMPLE IS PROVIDED WITHOUT WARRANTY OF ANY KIND. **
** **
************************************************************************/
/*
** COMPILATION NOTE:
**
** Compiled under MANX AZTEC C 3.6A. Use the +L compiler option
** and the "c32" library. Link with intrsup.o
*/
#include <exec/exec.h>
struct MsgPort *IPort = NULL;
struct MsgPort *RPort = NULL;
struct Interrupt *Intr = NULL;
long ASignal = -1;
/* Interrupt Processing Code */
IntrProc()
{
extern struct Message *GetMsg();
struct Message *msg;
int_start();
msg = GetMsg(IPort);
if (msg != NULL) ReplyMsg(msg);
int_end();
}
main()
{
struct Message msg;
MainInit();
msg.mn_Node.ln_Type = NT_MESSAGE;
msg.mn_Node.ln_Name = "swi.message";
msg.mn_ReplyPort = RPort;
puts("Causing interrupt...");
PutMsg(IPort, &msg);
puts("Awaiting reply...");
WaitPort(RPort);
puts("Got reply...");
GetMsg(RPort);
MainExit();
}
MainInit()
{
extern struct Interrupt *MakeIntr();
extern struct MsgPort *CreatePort();
extern struct Task *FindTask();
extern int Enable_Abort;
Enable_Abort = 0; /* prevent a CTRL-C */
Intr = MakeIntr("softint.example",-16,&IntrProc,0);
if (Intr == NULL) MainExit(201);
ASignal = AllocSignal(-1);
if (ASignal == -1) MainExit(202);
IPort = CreatePort("swi.port", 0);
if (IPort == NULL) MainExit(203);
RPort = CreatePort("swi.reply.port", 0);
if (RPort == NULL) MainExit(204);
IPort->mp_SoftInt = (struct Task *) Intr;
IPort->mp_Flags = PA_SOFTINT;
RPort->mp_SigBit = ASignal;
RPort->mp_SigTask = FindTask(NULL);
RPort->mp_Flags = PA_SIGNAL;
}
MainExit(error)
int error;
{
FreeIntr(Intr);
if (IPort != NULL) DeletePort(IPort);
if (RPort != NULL) DeletePort(RPort);
if (ASignal != -1) FreeSignal(ASignal);
exit(error);
}